home *** CD-ROM | disk | FTP | other *** search
/ Giga Games 1 / Giga Games.iso / net / usenet / vmsnet / empclint / part06 < prev    next >
Encoding:
Internet Message Format  |  1992-04-12  |  52.0 KB

  1. Path: uunet!mcsun!news.funet.fi!hydra!klaava!hurtta
  2. From: Kari.Hurtta@Helsinki.FI (Kari. E. Hurtta)
  3. Newsgroups: vmsnet.sources.games
  4. Subject: BSD Empire Client for VMS, part 6/8
  5. Message-ID: <1992Apr12.182135.15503@klaava.Helsinki.FI>
  6. Date: 12 Apr 92 18:21:35 GMT
  7. Sender: hurtta@klaava.Helsinki.FI (Kari Hurtta)
  8. Followup-To: vmsnet.sources.d
  9. Organization: University of Helsinki
  10. Lines: 1792
  11.  
  12. Archive-name: empireclient_110/part6
  13. Author: Kari.Hurtta@Helsinki.FI (Kari E. Hurtta)
  14. Product: Empire Client for VMS
  15. Version: 1.10
  16.  
  17. -+-+-+-+-+-+-+-+ START OF PART 6 -+-+-+-+-+-+-+-+
  18. X    vars`091V_BADDES`093.len = 0;
  19. X
  20. X    for (i = 0; i < database -> count; i++) `123
  21. X`009int X = database -> sectors`091i`093`091F_x`093.U_num;
  22. X`009int Y = database -> sectors`091i`093`091F_y`093.U_num;
  23. X
  24. X`009int yes = 0;
  25. X`009int dir;
  26. X`009int comm,peff;
  27. X
  28. X`009if (X == UNKNOWN_num `124`124 Y == UNKNOWN_num) continue;
  29. X
  30. X`009if (check_desig(database -> sectors`091i`093,&comm, &peff) > 0)`032
  31. X`009    yes = peff <= 5;
  32. X
  33. X`009if (yes) add_to_var_i(V_BADDES,X,Y);
  34. X    `125
  35. X`125
  36. X
  37. Xstatic int init_var(int *var,char *buffer)
  38. X`123
  39. X    int flag = 0;
  40. X
  41. X    *var = -1;
  42. X    if (*buffer == '=') flag = 1;
  43. X    else if (*buffer == '+') flag = -1;
  44. X    if (flag == 0) return 0;
  45. X
  46. X    buffer++;   `032
  47. X    if(sscanf(buffer,"$%d",var) != 1 `124`124
  48. X`009    *var < 0 `124`124 *var >= MAX_VARS) `123
  49. X`009write_line("Not such variable",E_tool,buffer);
  50. X`009return -1;
  51. X    `125
  52. X
  53. X    if (flag == 1) clear_var(*var);`032
  54. X    return 1;
  55. X`125
  56. X
  57. Xstatic int CompSect(sector_data *Sector1,sector_data *Sector2)
  58. X`123
  59. X    if ((*Sector1)`091F_y`093.U_num < (*Sector2)`091F_y`093.U_num) return -1
  60. V;
  61. X    if ((*Sector1)`091F_y`093.U_num > (*Sector2)`091F_y`093.U_num) return 1;
  62. X    if ((*Sector1)`091F_x`093.U_num < (*Sector2)`091F_x`093.U_num) return -1
  63. V;
  64. X    if ((*Sector1)`091F_x`093.U_num > (*Sector2)`091F_x`093.U_num) return 1;
  65. X    return 0;
  66. X`125
  67. X
  68. Xstatic void sort_database(sectors *database)
  69. X`123
  70. X    qsort(database -> sectors,database -> count,
  71. X`009sizeof(sector_data),CompSect);
  72. X`125
  73. X
  74. Xstatic sector_data *Locate(sectors *database,int x, int y)
  75. X`123
  76. X    sector_data Key;
  77. X    Key`091F_y`093.U_num = y;
  78. X    Key`091F_x`093.U_num = x;
  79. X    return bsearch(&Key,database -> sectors,database -> count,
  80. X`009sizeof(sector_data),CompSect);
  81. X`125
  82. X
  83. Xstatic sector_data *LocateNoSort(sectors *database,int x, int y)
  84. X`123  `032
  85. X    int i;
  86. X    for (i = 0; i <= database -> count; i++) `123
  87. X`009if (database -> sectors`091i`093`091F_x`093.U_num == x &&
  88. X`009    database -> sectors`091i`093`091F_y`093.U_num == y)
  89. X`009    return &database -> sectors`091i`093;
  90. X    `125
  91. X    return NULL;
  92. X`125
  93. X
  94. X#define UNKNOWN_text "?"
  95. X
  96. Xstatic void Text(sector_data *Sector, dump_fields Field, char *buffer)
  97. X`123
  98. X    switch (field_types`091Field`093) `123
  99. X`009case DF_num:
  100. X`009    if ((*Sector)`091Field`093.U_num == UNKNOWN_num)
  101. X`009`009strcpy(buffer,UNKNOWN_text);
  102. X`009    else sprintf(buffer,"%d",(*Sector)`091Field`093.U_num);
  103. X`009    break;
  104. X`009case DF_string:
  105. X`009    if ((*Sector)`091Field`093.U_string == UNKNOWN_string)
  106. X`009`009strcpy(buffer,UNKNOWN_text);
  107. X`009    else sprintf(buffer,"%s",refer_str_field(Sector,Field));
  108. X`009break;`009`009   `032
  109. X`009case DF_bool:
  110. X`009    if ((*Sector)`091Field`093.U_bool == UNKNOWN_bool)`032
  111. X`009`009strcpy(buffer,UNKNOWN_text);
  112. X`009    else if ((*Sector)`091Field`093.U_bool) strcpy(buffer,"*");
  113. X`009    else strcpy(buffer,".");
  114. X`009break;
  115. X`009case DF_char:
  116. X`009    if ((*Sector)`091Field`093.U_char == UNKNOWN_char)
  117. X`009`009strcpy(buffer,UNKNOWN_text);
  118. X`009    else sprintf(buffer,"%c",(*Sector)`091Field`093.U_char);
  119. X`009break;
  120. X    `125
  121. X`125
  122. X
  123. Xtypedef selector`091MAX_SECTORS`093;
  124. X
  125. Xstatic int cutarg(char **ptr,char *buffer) /* get one field from line */
  126. X`123
  127. X    char *prev = buffer;
  128. X    while (*(*ptr) == '&' `124`124
  129. X`009*(*ptr) == '#' `124`124`032
  130. X`009*(*ptr) == '<' `124`124
  131. X`009*(*ptr) == '>' `124`124
  132. X`009*(*ptr) == '=') (*ptr)++;
  133. X    while (*(*ptr) != '=' &&
  134. X`009*(*ptr) != '&' &&
  135. X`009*(*ptr) != '#' &&
  136. X`009*(*ptr) != '<' &&
  137. X`009*(*ptr) != '>' &&
  138. X`009*(*ptr) != '\0') *buffer++ = *(*ptr)++;
  139. X    *buffer = '\0';
  140. X
  141. X#ifdef ARGDEBUG
  142. X    printf("cutarg = %d: %s\n        > %s\n",prev != buffer,prev,*ptr);
  143. X#endif
  144. X
  145. X    return prev != buffer;
  146. X`125
  147. X
  148. Xstatic int cutoper(char **ptr,char *buffer) /* get one operator */
  149. X`123
  150. X    char *prev = buffer;
  151. X    while (*(*ptr) == '=' `124`124
  152. X`009*(*ptr) == '#' `124`124
  153. X`009*(*ptr) == '<' `124`124
  154. X`009*(*ptr) == '>') *buffer++ = *(*ptr)++;
  155. X    *buffer = '\0';
  156. X
  157. X#ifdef ARGDEBUG
  158. X    printf("cutoper = %d: %s\n        > %s\n",prev != buffer,prev,*ptr);
  159. X#endif
  160. X
  161. X    return prev != buffer;
  162. X`125
  163. X
  164. Xstatic void steparg(char **ptr)
  165. X`123
  166. X    while (*(*ptr) != '&' && *(*ptr) != '\0') (*ptr)++;
  167. X
  168. X#ifdef ARGDEBUG
  169. X    printf("steparg > %s\n",*ptr);
  170. X#endif
  171. X
  172. X`125
  173. X
  174. Xstatic int cutorarg(char **ptr,char *buffer) /* get one field from line */
  175. X`123
  176. X    char *prev = buffer;
  177. X    while (*(*ptr) == '`124') (*ptr)++;
  178. X    while (*(*ptr) != '`124' &&
  179. X`009*(*ptr) != '\0') *buffer++ = *(*ptr)++;
  180. X    *buffer = '\0';
  181. X
  182. X#ifdef ARGDEBUG
  183. X    printf("cutorarg = %d: %s\n        > %s\n",prev != buffer,prev,*ptr);
  184. X#endif
  185. X
  186. X    return prev != buffer;
  187. X`125
  188. X
  189. Xstatic int cutoroper(char **ptr,char *buffer) /* get one operator */
  190. X`123
  191. X    char *prev = buffer;
  192. X    while (*(*ptr) == '`124') *buffer++ = *(*ptr)++;
  193. X    *buffer = '\0';
  194. X
  195. X#ifdef ARGDEBUG
  196. X    printf("cutoroper = %d: %s\n        > %s\n",prev != buffer,prev,*ptr);
  197. X#endif
  198. X
  199. X    return prev != buffer;
  200. X`125
  201. X
  202. Xstatic void steporarg(char **ptr)
  203. X`123
  204. X    while (*(*ptr) != '`124' && *(*ptr) != '\0') (*ptr)++;
  205. X
  206. X#ifdef ARGDEBUG
  207. X    printf("steporarg > %s\n",*ptr);
  208. X#endif
  209. X`125
  210. X
  211. X#define FUNCHAR(c) ( (c) >= 'a' && (c) <= 'z' `124`124 \
  212. X`009`009     (c) >= 'A' && (c) <= 'Z' `124`124 \
  213. X`009`009     (c) == ':' `124`124 (c) == '_' `124`124 \
  214. X`009`009     (c) >= '0' && (c) <= '9' )
  215. X
  216. X
  217. Xstatic int cutexptoken(char **ptr,char *buffer,
  218. X`009`009       char *lbuffer) /* get expression token */
  219. X`123
  220. X    char *prev = buffer;
  221. X    while (*(*ptr) != '\0') `123
  222. X`009unsigned char C = *(*ptr)++;
  223. X`009*buffer++ = C;
  224. X`009if (C >= 'A' && C <= 'Z') C = C - 'A' + 'a';
  225. X`009*lbuffer++ = C;
  226. X`009if (!FUNCHAR(C)) break;
  227. X`009if (!FUNCHAR(**ptr))  break;
  228. X    `125
  229. X
  230. X    *buffer = '\0';
  231. X    *lbuffer = '\0';
  232. X
  233. X#ifdef ARGDEBUG
  234. X    printf("cutexptoken = %d: %s\n        > %s\n",prev != buffer,prev,*ptr);
  235. X#endif
  236. X
  237. X    return prev != buffer;
  238. X`125
  239. X
  240. X
  241. Xstatic void InitSelector(selector table)
  242. X`123
  243. X    int i;
  244. X    for (i = 0; i < MAX_SECTORS; i++) table`091i`093 = 1;
  245. X`125
  246. X
  247. Xstatic int BaseCord(int *xmin,int *xmax, int *ymin, int *ymax, char *Sel,
  248. X    int silent)
  249. X`123
  250. X   char *ptr;
  251. X   char *X=NULL,*Y=NULL;
  252. X   char buffer`091TERM_LEN`093;
  253. X
  254. X   if (!strcmp(Sel,"*")) return 1;
  255. X   `032
  256. X   strcpy(buffer,Sel);
  257. X   ptr = strchr(buffer,',');
  258. X   if(!ptr) `123
  259. X`009if (!silent) write_line("Bad sector specification",E_tool,Sel);
  260. X`009return 0;
  261. X    `125
  262. X    *ptr = '\0';
  263. X    X = buffer; Y = ptr+1;
  264. X
  265. X    /* Handle X */
  266. X    if (!strcmp(X,"*")) /* OK */ ;
  267. X    else `123
  268. X`009switch(sscanf(X,"%d:%d",xmin,xmax)) `123
  269. X`009    case 0:
  270. X`009`009if (!silent) write_line("Bad sector specification",E_tool,X);
  271. X`009`009return 0;
  272. X`009`009break;
  273. X`009    case 1:
  274. X`009`009*xmax = *xmin;
  275. X`009`009break;
  276. X`009    case 2:
  277. X`009`009/* OK */
  278. X`009`009break;
  279. X`009`125
  280. X    `125
  281. X   `032
  282. X    /* Handle Y */
  283. X    if (!strcmp(Y,"*")) /* OK */ ;
  284. X    else `123
  285. X`009switch(sscanf(Y,"%d:%d",ymin,ymax)) `123
  286. X`009    case 0:
  287. X`009`009if (!silent) write_line("Bad sector specification",E_tool,Y);
  288. X`009`009return 0;
  289. X`009`009break;
  290. X`009    case 1:
  291. X`009`009*ymax = *ymin;
  292. X`009`009break;
  293. X`009    case 2:
  294. X`009`009/* OK */
  295. X`009`009break;
  296. X`009`125
  297. X    `125
  298. X    return 1; /* ok */
  299. X
  300. X`125
  301. X
  302. Xstatic int Base(sectors *database, selector table, char *Sel)
  303. X`123
  304. X    int xmin = -9999, xmax = 9999;
  305. X    int ymin = -9999, ymax = 9999;
  306. X    int i,var = -1;
  307. X
  308. X    if (*Sel == '$')
  309. X    `123
  310. X`009if ((var = parse_var(Sel,database)) <0) return 0;
  311. X
  312. X`009for (i = 0; i < database -> count; i++)
  313. X`009    if (!is_in_var(var,
  314. X`009`009database -> sectors`091i`093`091F_x`093.U_num,
  315. X`009`009database -> sectors`091i`093`091F_y`093.U_num))
  316. X`009`009    table`091i`093 = 0;  `032
  317. X`009return 1;
  318. X    `125
  319. X
  320. X    if (!BaseCord(&xmin,&xmax,&ymin,&ymax,Sel,0)) return 0;
  321. X`032
  322. X    for (i = 0; i < database -> count; i++)
  323. X`009if( database -> sectors`091i`093`091F_x`093.U_num < xmin `124`124
  324. X`009    database -> sectors`091i`093`091F_x`093.U_num > xmax `124`124
  325. X`009    database -> sectors`091i`093`091F_y`093.U_num < ymin `124`124
  326. X`009    database -> sectors`091i`093`091F_y`093.U_num > ymax)
  327. X`009`009table`091i`093 = 0;
  328. X    return 1;
  329. X`125
  330. X
  331. X#define EXPRESSION_MAX 20
  332. X
  333. Xtypedef enum exp_oper `123 E_plus = 0, E_minus, E_mul, E_div, E_funcall,
  334. X`009`009`009E_field, E_num, OPER_MAX `125 exp_oper;
  335. X
  336. X#define OPER_LIMIT E_funcall
  337. Xtypedef struct exp `123
  338. X    int count;
  339. X    struct exp_elem `123
  340. X`009exp_oper F;
  341. X`009int L,R; `125 elems`091EXPRESSION_MAX`093;
  342. X`009`125 expression;
  343. X
  344. Xtypedef int expression_func (sector_data *sector);
  345. X
  346. Xint EX_needfood(sector_data *sector)
  347. X`123
  348. X    int L;
  349. X    if (!check_food(sector,&L)) return UNKNOWN_num;
  350. X    if (L > 0) return 0;
  351. X    return -L;
  352. X`125
  353. X
  354. Xint EX_foodleft(sector_data *sector)
  355. X`123
  356. X    int L;
  357. X    if (!check_food(sector,&L)) return UNKNOWN_num;
  358. X    if (L < 0) return 0;
  359. X    return L;
  360. X`125
  361. X
  362. Xint EX_proeff(sector_data *sector)
  363. X`123
  364. X    int C,E;
  365. X    if (!check_desig(sector,&C,&E) <= 0) return UNKNOWN_num;
  366. X    return C;
  367. X`125
  368. X
  369. Xint EX_newciv(sector_data *sector)
  370. X`123
  371. X    int civ,uw;
  372. X    if (!check_baby(sector,&civ,&uw)) return UNKNOWN_num;
  373. X    return civ;
  374. X`125
  375. X
  376. Xint EX_newuw(sector_data *sector)
  377. X`123
  378. X    int civ,uw;
  379. X    if (!check_baby(sector,&civ,&uw)) return UNKNOWN_num;
  380. X    return uw;
  381. X`125
  382. X
  383. X
  384. Xstatic struct funcs `123
  385. X    char *name;
  386. X    expression_func *func;
  387. X    `125 exp_functions`091`093 = `123 `123 "needfood", EX_needfood `125,
  388. X`009`009`009  `123 "foodleft", EX_foodleft `125,
  389. X`009`009`009  `123 "proeff",`009EX_proeff `125,
  390. X`009`009`009  `123 "newciv",`009EX_newciv `125,
  391. X`009`009`009  `123 "newuw",`009EX_newuw `125,
  392. X`009`009`009`125;
  393. X
  394. Xstatic int MatchFunc(char *buffer)
  395. X`123  `032
  396. X    int j;
  397. X    int match = -1,refer = -1;
  398. X    int count = 0;
  399. X    for (j = 0; j < sizeof(exp_functions) / sizeof(struct funcs); j++) `123
  400. X`009if (!strcmp(exp_functions`091j`093.name,buffer)) match = j;
  401. X`009if (strstr(exp_functions`091j`093.name,buffer) == exp_functions`091j`093
  402. V.name) `123
  403. X`009    refer = j;
  404. X`009    count++;
  405. X`009`125
  406. X    `125
  407. X    if (match != -1) return match;
  408. X    if (count > 1) `123
  409. X`009write_line("Ambiguous function",E_tool,buffer);
  410. X`009return -1;
  411. X    `125
  412. X    if (count == 0) `123
  413. X`009write_line("Unknown function",E_tool,buffer);
  414. X`009return -1;
  415. X    `125
  416. X    return refer;
  417. X`125
  418. X
  419. Xstatic int add_to_expression(expression *E,
  420. X`009exp_oper F, int L, int R)
  421. X`123
  422. X    if (E -> count >= EXPRESSION_MAX) `123
  423. X`009write_line("Expression too complex",E_tool,NULL);
  424. X`009return -1;
  425. X    `125
  426. X    E -> elems`091 E -> count`093.F = F;
  427. X    E -> elems`091 E -> count`093.L = L;
  428. X    E -> elems`091 E -> count`093.R = R;
  429. X    E -> count++;
  430. X    return E -> count -1;
  431. X`125
  432. X
  433. Xtypedef struct `123
  434. X    int f;
  435. X    char *Sel;
  436. X    char term`091TERM_LEN`093;
  437. X    char lterm`091TERM_LEN`093;
  438. X`125 exp_input;
  439. X
  440. Xstatic int exp_get(exp_input *I, char **term, char **lterm)
  441. X`123
  442. X    if (I -> f) `123
  443. X`009if (term) *term = I -> term;
  444. X`009if (lterm) *lterm = I -> lterm;
  445. X`009return 1;
  446. X    `125
  447. X    I -> f = cutexptoken(&(I -> Sel), I -> term, I -> lterm);
  448. X    if (I -> f) `123
  449. X`009if (term) *term = I -> term;
  450. X`009if (lterm) *lterm = I -> lterm;
  451. X`009return 1;
  452. X    `125
  453. X    return 0;
  454. X`125
  455. X
  456. Xstatic int exp_accept(exp_input *I)
  457. X`123
  458. X    I -> f = 0;
  459. X`125
  460. X
  461. Xstatic int exp_all(expression *E, exp_input *I);
  462. X
  463. Xstatic int exp_elem(expression *E, exp_input *I)
  464. X`123
  465. X    char *lterm, *term;
  466. X    if (!exp_get(I,&term,<erm)) `123
  467. X`009write_line("Unexpected end of expression",E_tool,NULL);
  468. X`009return -1;
  469. X    `125
  470. X
  471. X    if (StrEQ(term,"-",0) `124`124 StrEQ(term,"+",0)) `123
  472. X`009int plus = StrEQ(term,"+",0);
  473. X`009int L = add_to_expression(E,E_num,0,0);
  474. X`009int R;
  475. X`009if (L == -1) return -1;
  476. X`009exp_accept(I);
  477. X`009R = exp_elem(E,I);
  478. X`009if (R == -1) return -1;
  479. X`009return add_to_expression(E, plus ? E_plus : E_minus, L , R);
  480. X    `125 else if (*term >= '0' && *term <= '9') `123
  481. X`009exp_accept(I);
  482. X`009return add_to_expression(E,E_num,atoi(term),0);
  483. X    `125 else if (*lterm == ':') `123
  484. X`009int i = MatchFunc(lterm+1);
  485. X`009exp_accept(I);
  486. X`009if (i == -1) return -1;
  487. X`009return add_to_expression(E,E_funcall,i,0);
  488. X    `125 else if (StrEQ(term,"(",0)) `123
  489. X`009int pos;
  490. X`009exp_accept(I);
  491. X`009pos = exp_all(E,I);
  492. X`009if (!exp_get(I,&term,<erm)) `123
  493. X`009    write_line("Missing )",E_tool,NULL);
  494. X`009    return -1;
  495. X`009`125
  496. X`009if (!StrEQ(term,")",0)) `123
  497. X`009    write_line("Expected )",E_tool,term);
  498. X`009    return -1;
  499. X`009`125
  500. X`009exp_accept(I);
  501. X`009return pos;
  502. X    `125 else `123
  503. X`009int i = MatchRef(term);
  504. X`009if (i == F_NULL) return -1;
  505. X`009if (field_types`091i`093 != DF_num) `123
  506. X`009    write_line("Field isn't numerical",E_tool,term);
  507. X`009    return -1;
  508. X`009`125
  509. X`009exp_accept(I);
  510. X`009return add_to_expression(E,E_field,i,0);
  511. X    `125
  512. X    return -1;
  513. X`125
  514. X
  515. Xstatic int exp_mul(expression *E, exp_input *I)
  516. X`123
  517. X    char *lterm, *term;
  518. X    int pos;
  519. X
  520. X    pos = exp_elem(E,I);
  521. X    if (pos == -1) return -1;
  522. X
  523. X    while (exp_get(I,&term,<erm) &&`032
  524. X`009( StrEQ(term,"*",0) `124`124 StrEQ(term,"/",0)))  `123
  525. X`009int mul = StrEQ(term,"*",0);
  526. X`009int R, L = pos;
  527. X`009exp_accept(I);
  528. X`009R = exp_elem(E,I);
  529. X`009if (R == -1) return -1;
  530. X`009pos = add_to_expression(E, mul ? E_mul : E_div, L, R);
  531. X`009if (pos == -1) return -1;
  532. X    `125
  533. X    return pos;
  534. X`125
  535. X
  536. Xstatic int exp_all(expression *E, exp_input *I)
  537. X`123
  538. X    char *lterm, *term;
  539. X    int pos;
  540. X
  541. X    pos = exp_mul(E,I);
  542. X    if (pos == -1) return -1;
  543. X
  544. X    while (exp_get(I,&term,<erm) &&`032
  545. X`009( StrEQ(term,"+",0) `124`124 StrEQ(term,"-",0))) `123
  546. X`009int add = StrEQ(term,"+",0);
  547. X`009int R, L = pos;
  548. X`009exp_accept(I);
  549. X`009R = exp_mul(E,I);
  550. X`009if (R == -1) return -1;
  551. X`009pos = add_to_expression(E, add ? E_plus : E_minus, L, R);
  552. X`009if (pos == -1) return -1;
  553. X    `125
  554. X    return pos;
  555. X`125
  556. X
  557. Xstatic int parse_expression(expression *E, int *Sel)
  558. X`123
  559. X    exp_input data;
  560. X    int result;
  561. X    int more;
  562. X    char *term,*lterm;
  563. X    int error;
  564. X    char buffer1`091TERM_LEN+20`093,buffer2`091TERM_LEN+30`093;
  565. X
  566. X    data.f = 0;
  567. X    data.Sel = Sel;
  568. X   `032
  569. X    E -> count = 0;
  570. X    result = exp_all(E,&data);
  571. X    more = exp_get(&data,&term,<erm);
  572. X
  573. X    error = (more `124`124 result == -1);
  574. X   `032
  575. X    if (error) `123
  576. X
  577. X`009if (more) sprintf(buffer2,", next token '%s'",term);
  578. X`009else strcpy(buffer2,"");
  579. X
  580. X`009sprintf(buffer1,"Error in expression%s",buffer2);
  581. X`009write_line(buffer1,E_tool,Sel);
  582. X`009return 0;
  583. X    `125
  584. X    return 1;
  585. X`125
  586. X
  587. Xstatic int execute_expression(expression E, sector_data *sector)
  588. X`123
  589. X    int result`091EXPRESSION_MAX`093;
  590. X    int i;
  591. X    int res = 0;
  592. X
  593. X    for (i = 0; i < E.count; i++) `123
  594. X`009switch(E.elems`091i`093.F) `123
  595. X`009    case E_funcall:
  596. X`009`009res = exp_functions`091E.elems`091i`093.L`093.func(sector);
  597. X#ifdef EXP_DEBUG
  598. X`009`009printf("%d: funcall %-10s=> %d\n",i,
  599. X`009`009`009exp_functions`091E.elems`091i`093.L`093.name,res);
  600. X#endif
  601. X`009`009break;
  602. X`009    case E_field:
  603. X`009`009res = (*sector)`091E.elems`091i`093.L`093.U_num;
  604. X#ifdef EXP_DEBUG
  605. X`009`009printf("%d: field            => %d\n",i,res);
  606. X#endif
  607. X`009`009break;
  608. X`009    case E_num:
  609. X`009`009res = E.elems`091i`093.L;
  610. X#ifdef EXP_DEBUG
  611. X`009`009printf("%d: num %d           => %d\n",i,
  612. X`009`009`009E.elems`091i`093.L,res);
  613. X#endif
  614. X`009`009break;
  615. X`009    case E_plus:
  616. X`009`009res = result`091E.elems`091i`093.L`093 + result`091E.elems`091i`093.
  617. VR`093;
  618. X#ifdef EXP_DEBUG
  619. X`009`009printf("%d: plus %d %d       => %d\n",i,
  620. X`009`009`009E.elems`091i`093.L,E.elems`091i`093.R,res);
  621. X#endif
  622. X`009`009break;
  623. X`009    case E_minus:
  624. X`009`009res = result`091E.elems`091i`093.L`093 - result`091E.elems`091i`093.
  625. VR`093;
  626. X#ifdef EXP_DEBUG
  627. X`009`009printf("%d: minus %d %d      => %d\n",i,
  628. X`009`009`009E.elems`091i`093.L,E.elems`091i`093.R,res);
  629. X#endif
  630. X`009`009break;
  631. X`009    case E_mul:
  632. X`009`009res = result`091E.elems`091i`093.L`093 * result`091E.elems`091i`093.
  633. VR`093;
  634. X#ifdef EXP_DEBUG
  635. X`009`009printf("%d: mul %d %d        => %d\n",i,
  636. X`009`009`009E.elems`091i`093.L,E.elems`091i`093.R,res);
  637. X#endif
  638. X`009`009break;
  639. X`009    case E_div:
  640. X`009`009if (result`091E.elems`091i`093.R`093 == 0) res = UNKNOWN_num;
  641. X`009`009else res = result`091E.elems`091i`093.L`093 / result`091E.elems`091i
  642. V`093.R`093;
  643. X#ifdef EXP_DEBUG
  644. X`009`009printf("%d: div %d %d        => %d\n",i,
  645. X`009`009`009E.elems`091i`093.L,E.elems`091i`093.R,res);
  646. X#endif
  647. X`009`009break;
  648. X`009`125
  649. X`009if (res == UNKNOWN_num) return UNKNOWN_num;
  650. X`009result`091i`093 = res;
  651. X    `125
  652. X    return res;
  653. X`125
  654. X
  655. Xstatic int  andFilter(sectors *database, selector table, char *Sel)
  656. X`123
  657. X    int i,flag, error = 0;
  658. X    dump_fields field;
  659. X    char *oper;
  660. X    char buffer`091TERM_LEN`093,buffer2`091TERM_LEN`093,buffer3`091TERM_LEN`
  661. V093,
  662. X`009obuffer`091TERM_LEN`093;
  663. X
  664. X    while (cutarg(&Sel,buffer)) `123
  665. X`009if (*buffer == '$') `123`009/* handle variables */
  666. X`009    int var;
  667. X`009    if ((var = parse_var(buffer,database)) <0) `123
  668. X`009`009error = 1;
  669. X`009    `125 else `123
  670. X`009`009for (i = 0; i < database -> count; i++)
  671. X`009`009    if (!is_in_var(var,
  672. X`009`009`009database -> sectors`091i`093`091F_x`093.U_num,
  673. X`009`009`009database -> sectors`091i`093`091F_y`093.U_num))
  674. X`009`009`009table`091i`093 = 0; `032
  675. X`009    `125
  676. X`009`125 else `123
  677. X`009 if(!cutoper(&Sel,obuffer)) buffer2`0910`093 = '\0';
  678. X`009 else cutarg(&Sel,buffer2);
  679. X`009 field = MatchRef(buffer);
  680. X`009 if (field != F_NULL) `123
  681. X`009    int exp_flag = 0;
  682. X`009    switch (field_types`091field`093) `123
  683. X`009`009 int num,val;
  684. X`009`009 char *val2;
  685. X`009`009 expression E;
  686. X`009    case DF_num:
  687. X`009`009if (*buffer2) `123
  688. X`009`009    if (StrEQ(buffer2,UNKNOWN_text,0)) num = UNKNOWN_num;
  689. X`009`009    else if (!parse_expression(&E,buffer2)) `123
  690. X`009`009`009error = 1;
  691. X`009`009`009continue;   /* go to while */
  692. X`009`009    `125 else exp_flag = 1;
  693. X`009`009`125 else num = 0;
  694. X`009`009for (i = 0; i < database -> count; i++) `123
  695. X`009`009    val = database -> sectors`091i`093`091field`093.U_num;
  696. X`009`009    if (exp_flag) num =`032
  697. X`009`009`009execute_expression(E,database -> sectors`091i`093);
  698. X`009`009    flag = 0;
  699. X`009`009    for (oper = obuffer; *oper; oper++) `123
  700. X`009`009`009if (val == UNKNOWN_num `124`124 num == UNKNOWN_num) `123
  701. X`009`009`009    if (*oper == '=') flag = (val == num);
  702. X`009`009`009    else if (*oper == '#' && num == UNKNOWN_num)
  703. X`009`009`009`009flag = (val != num);
  704. X`009`009`009    else flag = 1;
  705. X`009`009`009`125 else switch(*oper) `123
  706. X`009`009`009    case '=':
  707. X`009`009`009`009if (val == num) flag = 1;
  708. X`009`009`009`009break;
  709. X`009`009`009    case '#':
  710. X`009`009`009`009if (val != num) flag = 1;
  711. X`009`009`009`009break;
  712. X`009`009`009    case '<':
  713. X`009`009`009`009if (val < num) flag = 1;
  714. X`009`009`009`009break;
  715. X`009`009`009    case '>':
  716. X`009`009`009    if (val > num) flag = 1;
  717. X`009`009`009    break;
  718. X`009`009`009`125
  719. X`009`009    `125
  720. X`009`009    if (!flag) table`091i`093 = 0;
  721. X`009`009`125
  722. X`009`009break;
  723. X`009    case DF_string:
  724. X`009`009for (i = 0; i < database -> count; i++) `123
  725. X`009`009    char *str = buffer2;
  726. X`009`009    if (StrEQ(buffer2,UNKNOWN_text,0)) str = UNKNOWN_string;
  727. X
  728. X`009`009    if (database -> sectors`091i`093`091field`093.U_string == UNKNOW
  729. VN_string)
  730. X`009`009`009val2 = UNKNOWN_string;
  731. X`009`009    else val2 = refer_str_field(&database -> sectors`091i`093,field)
  732. V;
  733. X`009`009    flag = 0;
  734. X`009`009    for (oper = obuffer; *oper; oper++) `123
  735. X`009`009`009if (val2 == UNKNOWN_string `124`124 str == UNKNOWN_string) `123
  736. X`009`009`009    if (*oper == '=') flag = (val2 == str);
  737. X`009`009`009    else if (*oper == '#' && str == UNKNOWN_string)
  738. X`009`009`009`009flag = (val2 != str);
  739. X`009`009`009    else flag = 1;
  740. X`009`009`009`125 else switch(*oper) `123
  741. X`009`009`009    case '=':
  742. X`009`009`009    if (StrEQ(val2,str,0)) flag = 1;
  743. X`009`009`009    break;
  744. X`009`009`009case '#':
  745. X`009`009`009    if (!StrEQ(val2,str,0)) flag = 1;
  746. X`009`009`009    break;
  747. X`009`009`009case '<':
  748. X`009`009`009    if (strcmp(val2,str) < 0) flag = 1;
  749. X`009`009`009    break;
  750. X`009`009`009case '>':
  751. X`009`009`009    if (strcmp(val2,str) > 0) flag = 1;
  752. X`009`009`009    break;
  753. X`009`009`009`125
  754. X`009`009    `125
  755. X`009`009    if (!flag) table`091i`093 = 0;
  756. X`009`009`125
  757. X`009`009break;`009`009   `032
  758. X`009    case DF_bool:
  759. X`009`009if (*buffer2 == '\0' &&
  760. X`009`009    *obuffer == '\0') `123
  761. X`009`009`009/* search with only boolean is same as boolean=t */
  762. X`009`009    strcpy(buffer2,"*");
  763. X`009`009    strcpy(obuffer,"=");
  764. X`009`009`125
  765. X
  766. X`009`009if (*buffer2) `123
  767. X`009`009    if (StrEQ(buffer2,UNKNOWN_text,0)) num = UNKNOWN_bool;
  768. X`009`009    else if (!strcmp(buffer2,".") `124`124 !strcmp(buffer2,"0")
  769. X`009`009`009`124`124 !strcmp(buffer2,"f")) num = 0;
  770. X`009`009    else if (!strcmp(buffer2,"*") `124`124 !strcmp(buffer2,"1")
  771. X`009`009`009`124`124 !strcmp(buffer2,"t")) num = 1;
  772. X`009`009    else `123
  773. X`009`009`009write_line("Not boolean",E_tool,buffer2);
  774. X`009`009`009error = 1;
  775. X`009`009`009continue;   /* go to while */
  776. X`009`009    `125
  777. X`009`009`125 else num = 0;
  778. X`009`009for (i = 0; i < database -> count; i++) `123
  779. X`009`009    val = database -> sectors`091i`093`091field`093.U_num;
  780. X`009`009    flag = 0;
  781. X`009`009    for (oper = obuffer; *oper; oper++) `123
  782. X`009`009`009if (val == UNKNOWN_bool `124`124 num == UNKNOWN_bool) `123
  783. X`009`009`009    if (*oper == '=') flag = (val == num);
  784. X`009`009`009    else if (*oper == '#' && num == UNKNOWN_bool)
  785. X`009`009`009`009flag = (val != num);
  786. X`009`009`009    else flag = 1;
  787. X`009`009`009`125 else switch(*oper) `123
  788. X`009`009`009    case '=':
  789. X`009`009`009`009if (val == num) flag = 1;
  790. X`009`009`009`009break;
  791. X`009`009`009    case '#':
  792. X`009`009`009`009if (val != num) flag = 1;
  793. X`009`009`009`009break;
  794. X`009`009`009    case '<':
  795. X`009`009`009`009if (val < num) flag = 1;
  796. X`009`009`009`009break;
  797. X`009`009`009    case '>':
  798. X`009`009`009`009if (val > num) flag = 1;
  799. X`009`009`009    break;
  800. X`009`009`009`125
  801. X`009`009    `125
  802. X`009`009    if (!flag) table`091i`093 = 0;
  803. X`009`009`125
  804. X`009    break;
  805. X`009    case DF_char:
  806. X`009`009if (*buffer2) `123
  807. X`009`009    if (StrEQ(buffer2,UNKNOWN_text,0)) num = UNKNOWN_char;
  808. X`009`009    else `123
  809. X`009`009`009if (strlen(buffer2) != 1) `123
  810. X`009`009`009    write_line("Not character",E_tool,buffer2);
  811. X`009`009`009    error = 1;
  812. X`009`009`009    continue;   /* go to while */
  813. X`009`009`009`125  `032
  814. X`009`009`009num = buffer2`0910`093;
  815. X`009`009    `125
  816. X`009`009`125 else num = 0;
  817. X`009`009for (i = 0; i < database -> count; i++) `123
  818. X`009`009    val = database -> sectors`091i`093`091field`093.U_num;
  819. X`009`009    flag = 0;
  820. X`009`009    for (oper = obuffer; *oper; oper++) `123
  821. X`009`009`009if (val == UNKNOWN_char `124`124 num == UNKNOWN_char) `123
  822. X`009`009`009    if (*oper == '=') flag = (val == num);
  823. X`009`009`009    else if (*oper == '#' && num == UNKNOWN_char)
  824. X`009`009`009`009flag = (val != num);
  825. X`009`009`009    else flag = 1;
  826. X`009`009`009`125 else switch(*oper) `123
  827. X`009`009`009    case '=':
  828. X`009`009`009`009if (val == num) flag = 1;
  829. X`009`009`009    break;
  830. X`009`009`009    case '#':
  831. X`009`009`009`009if (val != num) flag = 1;
  832. X`009`009`009    break;
  833. X`009`009`009    case '<':
  834. X`009`009`009`009if (val < num) flag = 1;
  835. X`009`009`009    break;
  836. X`009`009`009    case '>':
  837. X`009`009`009`009if (val > num) flag = 1;
  838. X`009`009`009    break;
  839. X`009`009`009`125
  840. X`009`009    `125
  841. X`009`009    if (!flag) table`091i`093 = 0;
  842. X`009`009`125
  843. X`009    break;
  844. X`009    `125
  845. X`009  `125 else error = 1;
  846. X`009`125
  847. X`009steparg(&Sel);
  848. X    `125   `032
  849. X    return (!error);
  850. X`125
  851. X
  852. Xstatic int Filter(sectors *database, selector table, char *Sel)
  853. X`123
  854. X    char *start;
  855. X    char buffer`091TERM_LEN`093;
  856. X    int error = 0,i;
  857. X    selector ortable,andtable;
  858. X    if (*Sel == '?') Sel++;
  859. X    start = Sel;
  860. X       `032
  861. X    for (i = 0; i < database -> count; i++) ortable`091i`093 = 0;
  862. X
  863. X    while(cutorarg(&Sel,buffer)) `123
  864. X`009InitSelector(andtable);
  865. X`009
  866. X`009if (!andFilter(database,andtable,buffer)) `123
  867. X`009    error = 1;
  868. X`009    if (!StrEQ(start,buffer,0))
  869. X`009`009write_line("Bad selection component",E_tool,buffer);
  870. X`009`125
  871. X
  872. X`009for (i = 0; i < database -> count; i++)`032
  873. X`009    if (andtable`091i`093) ortable`091i`093 = 1;
  874. X`009steporarg(&Sel);
  875. X    `125
  876. X
  877. X    for (i = 0; i < database -> count; i++)`032
  878. X`009if (!ortable`091i`093) table`091i`093 = 0;
  879. X
  880. X    return (!error);
  881. X`125
  882. X
  883. Xstatic char *FieldName(dump_fields field)
  884. X`123
  885. X    int i;
  886. X    for (i = 0; i <= LAST_DUMP_FIELD; i++)`032
  887. X`009if (fields`091i`093.id == field) return fields`091i`093.text;
  888. X    return NULL;
  889. X
  890. X`125
  891. X
  892. X/* Update DUMP ************************************************************
  893. V */
  894. X
  895. Xstatic parse_dump_update(data_type D,char *line)
  896. X`123
  897. X    static int error = 0;
  898. X    if (temp_database.linecount == 0) `123
  899. X`009temp_database.count = 0;
  900. X    `009error = 0;
  901. X`009if (!temp_database.sectors) `123
  902. X`009    if(!init_database(&temp_database)) `123
  903. X`009`009error = 1;
  904. X`009`009return;
  905. X`009    `125
  906. X`009`125 else reset_database(&temp_database);
  907. X    `125
  908. X    if (D == D_EOD) `123
  909. X
  910. X`009if (error `124`124 temp_database.linecount == 0 `124`124 empiretool_canc
  911. Vel) `123
  912. X`009    if (empiretool_cancel) write_line("Canceled.",E_tool,NULL);
  913. X`009    empiretool_cancel = 0;
  914. X`009    error = 0;
  915. X`009`125 else `123
  916. X`009    char buffer`091PROMPT_SIZE`093;
  917. X
  918. X`009    sprintf(buffer,"%d sector%s",
  919. X`009`009temp_database.count, temp_database.count == 1 ? "" : "s");
  920. X`009    write_line(buffer,E_tool,NULL);
  921. X
  922. X`009    sort_database(&temp_database); /* new update_database requires */
  923. X`009    update_database(&dump_database,&temp_database);
  924. X`009    check_visual();
  925. X
  926. X`009    sprintf(buffer,"Total: %d sector%s",
  927. X`009`009dump_database.count, dump_database.count == 1 ? "" : "s");
  928. X`009    write_line(buffer,E_tool,NULL);
  929. X
  930. X`009`125
  931. X
  932. X`009temp_database.linecount = 0;`009/* is ended */
  933. X`009call_empiretool_handler();
  934. X
  935. X    `125 else if (D == D_data && IsWarning(line)) `123
  936. X`009return; /* ok: IsWarning print message */
  937. X    `125 else if (D == D_data && fatal_message(line)) `123
  938. X`009error = 1;  /* COMMAND failed */
  939. X`009return; /* fatal_message print message */
  940. X    `125 else if (D == D_prompt) `123
  941. X`009ask_message(line);  /* ask from user */
  942. X`009return;`032
  943. X    `125 else if (error) `123
  944. X`009return; /* skip rest */
  945. X    `125 else if (!parse_one_line(&temp_database,line)) `123
  946. X`009write_line("Can't parse",E_tool,line);
  947. X`009error = 1;
  948. X    `125
  949. X`125
  950. X
  951. X/* Spy for DUMP ************************************************************
  952. V */
  953. X
  954. Xstatic int parse_spy_line(sectors *database, char *line)
  955. X`123
  956. X    char buffer`091MAX_FIELD+1`093;
  957. X    int lc = ++(database -> linecount);
  958. X    int i,ok,known,unknown;
  959. X    dump_fields match,j;
  960. X    int pos;
  961. X    int X,Y;
  962. X    sector_data *temp;
  963. X
  964. X    switch(lc) `123
  965. X    case 1:`009/* SPY report */
  966. X`009return (strstr(line,"SPY report") != NULL);
  967. X    case 2:`009/* time line */
  968. X`009strcpy(database -> date,line);
  969. X`009return 1;
  970. X    case 3:`009/* field names */
  971. X`009known = 0;
  972. X`009unknown = 0;
  973. X`009for (i = 0; i < MAX_ROWS; i++)`032
  974. X`009    database -> parse_index`091i`093 = F_NULL;
  975. X`009  `032
  976. X`009/* sect -field */
  977. X`009if (!stepper(&line,buffer,sizeof(buffer)) `124`124
  978. X`009    !StrEQ(buffer,"sect",1)) return 0;
  979. X`009  `032
  980. X`009/* rest */
  981. X`009for (i = 0; stepper(&line,buffer,sizeof(buffer)) && i < MAX_ROWS; i++) `
  982. V123
  983. X`009    match = Ref(buffer);;
  984. X`009    if (match == F_NULL) unknown++;
  985. X`009    else known++;
  986. X`009    database -> parse_index`091i`093 = match;
  987. X`009`125
  988. X`009sprintf(buffer,"%d known field%s, %d unknow field%s",
  989. X`009    known, match == 1 ? "" : "s",
  990. X`009    unknown, unknown == 1 ? "" : "s");
  991. X`009write_line(buffer,E_tool,NULL);
  992. X`009return 1;
  993. X    default:`032
  994. X`009/* check that there is space left */
  995. X`009if (!realloc_database(database)) return 0;
  996. X
  997. X`009pos = database -> count++;
  998. X`009temp = database -> sectors;
  999. X
  1000. X`009/* messages */
  1001. X`009if (sscanf(line,"Spy deported from %d,%d",&X,&Y) == 2) `123
  1002. X`009    temp`091pos`093`091F_x`093.U_num = X;
  1003. X`009    temp`091pos`093`091F_y`093.U_num = Y;
  1004. X`009    temp`091pos`093`091F_OWNED`093.U_bool = 0;  /* Not mine */
  1005. X`009    write_line(line,E_none,NULL);   /* print this */
  1006. X`009    return 1;`009/* ok */
  1007. X`009`125 else if (sscanf(line,"BANG!! A spy was shot in %d,%d",&X,&Y) == 2)
  1008. V `123
  1009. X`009    temp`091pos`093`091F_x`093.U_num = X;
  1010. X`009    temp`091pos`093`091F_y`093.U_num = Y;
  1011. X`009    temp`091pos`093`091F_OWNED`093.U_bool = 0;  /* Not mine */
  1012. X`009    write_line(line,E_none,NULL);   /* print this */
  1013. X`009    return 1;`009/* ok */
  1014. X`009`125
  1015. X
  1016. X`009/* sect -field */
  1017. X`009if (!stepper(&line,buffer,sizeof(buffer)) `124`124
  1018. X`009    sscanf(buffer,"%d,%d",&X,&Y) != 2) return 0;
  1019. X`009temp`091pos`093`091F_x`093.U_num = X;
  1020. X`009temp`091pos`093`091F_y`093.U_num = Y;
  1021. X`009  `032
  1022. X`009/* rest */
  1023. X`009temp`091pos`093`091F_OWNED`093.U_bool = 0; /* Not mine */
  1024. X`009ok = 1;
  1025. X`009for (i = 0; stepper(&line,buffer,sizeof(buffer)) && i < MAX_ROWS; i++) `
  1026. V123
  1027. X`009    match = database -> parse_index`091i`093;
  1028. X`009    if (match == F_NULL) /* OK */;
  1029. X`009    else switch (field_types`091match`093) `123
  1030. X`009`009case DF_num:
  1031. X`009`009    if (sscanf(buffer,"%d",
  1032. X`009`009`009&temp`091pos`093`091match`093.U_num) != 1) ok = 0;
  1033. X`009`009    break;
  1034. X`009`009case DF_string:
  1035. X`009`009    change_str_field(temp,pos,match,buffer);
  1036. X`009`009    break;`009`009   `032
  1037. X`009`009case DF_bool:
  1038. X`009`009    if (strlen(buffer) != 1) ok = 0;
  1039. X`009`009    temp`091pos`093`091match`093.U_bool = buffer`0910`093 != '.';
  1040. X`009`009    break;
  1041. X`009`009case DF_char:
  1042. X`009`009    if (strlen(buffer) != 1) ok = 0;
  1043. X`009`009    temp`091pos`093`091match`093.U_char = buffer`0910`093;
  1044. X`009`009    break;
  1045. X`009    `125
  1046. X`009`125
  1047. X`009return ok;
  1048. X    `125
  1049. X`125
  1050. X
  1051. Xstatic parse_dump_spy(data_type D,char *line)
  1052. X`123
  1053. X    static int error = 0;
  1054. X    if (temp_database.linecount == 0) `123
  1055. X`009temp_database.count = 0;
  1056. X    `009error = 0;
  1057. X`009if (!temp_database.sectors) `123
  1058. X`009    if(!init_database(&temp_database)) `123
  1059. X`009`009error = 1;
  1060. X`009`009return;
  1061. X`009    `125
  1062. X`009`125 else reset_database(&temp_database);
  1063. X    `125
  1064. X    if (D == D_EOD) `123
  1065. X
  1066. X`009if (error `124`124 temp_database.linecount == 0 `124`124 empiretool_canc
  1067. Vel) `123
  1068. X`009    if (empiretool_cancel) write_line("Canceled.",E_tool,NULL);
  1069. X`009    empiretool_cancel = 0;
  1070. X`009    error = 0;
  1071. X`009`125 else `123
  1072. X`009    char buffer`091PROMPT_SIZE`093;
  1073. X
  1074. X`009    sort_database(&temp_database);
  1075. X`009    pack_database(&temp_database);`009/* remove duplicates */
  1076. X
  1077. X`009    sprintf(buffer,"%d sector%s",
  1078. X`009`009temp_database.count, temp_database.count == 1 ? "" : "s");
  1079. X`009    write_line(buffer,E_tool,NULL);
  1080. X
  1081. X`009    update_database(&dump_database,&temp_database);
  1082. X`009    check_visual();
  1083. X
  1084. X`009    sprintf(buffer,"Total: %d sector%s",
  1085. X`009`009dump_database.count, dump_database.count == 1 ? "" : "s");
  1086. X`009    write_line(buffer,E_tool,NULL);
  1087. X
  1088. X`009`125
  1089. X
  1090. X`009temp_database.linecount = 0;`009/* is ended */
  1091. X`009call_empiretool_handler();
  1092. X
  1093. X    `125 else if (D == D_data && IsWarning(line)) `123
  1094. X`009return; /* ok: IsWarning print message */
  1095. X    `125 else if (D == D_data && fatal_message(line)) `123
  1096. X`009error = 1;  /* COMMAND failed */
  1097. X`009return; /* fatal_message print message */
  1098. X    `125 else if (D == D_prompt) `123
  1099. X`009ask_message(line);  /* ask from user */
  1100. X`009return;`032
  1101. X    `125 else if (error) `123
  1102. X`009return; /* skip rest */
  1103. X    `125 else if (!parse_spy_line(&temp_database,line)) `123
  1104. X`009write_line("Can't parse",E_tool,line);
  1105. X`009error = 1;
  1106. X    `125
  1107. X`125
  1108. X
  1109. X/* read EXPLORE 'dump' ***************************************************
  1110. V  */
  1111. X
  1112. X#define EXP_LINES 3
  1113. X#define EXP_CUT 12
  1114. Xstatic char exp_lines`091EXP_LINES`093`091EXP_CUT+1`093;
  1115. Xstatic char exp_line`091ERROR_LEN`093;
  1116. X
  1117. Xstatic int parse_explore_line(sectors *database, char *line)
  1118. X`123
  1119. X    int known,unknown,i;
  1120. X    dump_fields match;
  1121. X    char buffer`091ERROR_LEN`093;
  1122. X    int lc = ++(database -> linecount);
  1123. X
  1124. X    if (lc > EXP_LINES) return 0;`009    /* something is wrong */
  1125. X
  1126. X    strncpy(exp_lines`091lc-1`093,line,EXP_CUT);
  1127. X    exp_lines`091lc-1`093`091EXP_CUT`093 = '\0';
  1128. X
  1129. X    line = line + EXP_CUT;
  1130. X
  1131. X    switch(lc) `123
  1132. X    case 1:
  1133. X`009known = 0;
  1134. X`009unknown = 0;
  1135. X`009for (i = 0; i < MAX_ROWS; i++)`032
  1136. X`009    database -> parse_index`091i`093 = F_NULL;
  1137. X`009  `032
  1138. X`009/* rest */
  1139. X`009for (i = 0; stepper(&line,buffer,sizeof(buffer)) && i < MAX_ROWS; i++) `
  1140. V123
  1141. X`009    match = Ref(buffer);;
  1142. X`009    if (match == F_NULL) unknown++;
  1143. X`009    else known++;
  1144. X`009    database -> parse_index`091i`093 = match;
  1145. X`009`125
  1146. X`009/*
  1147. X`009sprintf(buffer,"%d known field%s, %d unknow field%s",
  1148. X`009    known, match == 1 ? "" : "s",
  1149. X`009    unknown, unknown == 1 ? "" : "s");
  1150. X`009write_line(buffer,E_tool,NULL);
  1151. X`009*/
  1152. X`009return 1;
  1153. X    case 2:
  1154. X`009strcpy(exp_line,line);
  1155. X`009return 1;
  1156. X    case 3:
  1157. X`009return 1;
  1158. X    `125
  1159. X    return 0;
  1160. X`125
  1161. X
  1162. Xstatic int count_lead_space(char *line)
  1163. X`123
  1164. X    int res = 0;
  1165. X    while (*line++ == ' ') res++;
  1166. X    return res;
  1167. X`125
  1168. X
  1169. Xstatic int map_add_sector(sectors *database,int X, int Y, char C);
  1170. X
  1171. Xint start_X,start_Y;
  1172. Xint cur_X,cur_Y,cur_mob;
  1173. Xint tar_X,tar_Y;
  1174. X
  1175. Xstatic int parse_explore_query(sectors *database, char *line)
  1176. X`123
  1177. X    int X,Y,A,B,ok,pos,i;
  1178. X    float mob;
  1179. X    char des, C;
  1180. X    sector_data *temp;
  1181. X    int new_X,new_Y;
  1182. X    char buffer`09110`093,*ptr;
  1183. X    dump_fields match;
  1184. X
  1185. X    if (database -> linecount != EXP_LINES) `123
  1186. X`009write_line("Line count not match",E_tool,NULL);
  1187. X`009return 0; /* something is wrong */
  1188. X    `125
  1189. X   `032
  1190. X    if (sscanf(line,"<%f: %c %d,%d>",&mob,&des,&X,&Y) != 4) `123
  1191. X`009write_line("Bad prompt",E_tool,line);
  1192. X`009return 0;   /* something is wrong */
  1193. X    `125
  1194. X
  1195. X    if (des == ' ') `123
  1196. X`009write_line("No desig in prompt",E_tool,line);
  1197. X`009return 0;
  1198. X    `125
  1199. X
  1200. X    cur_X = X;
  1201. X    cur_Y = Y;
  1202. X    cur_mob = mob;
  1203. X
  1204. X    A = count_lead_space(exp_lines`0910`093);
  1205. X    B = count_lead_space(exp_lines`0911`093);
  1206. X    if (count_lead_space(exp_lines`0912`093) != A `124`124 A != B +1) `123
  1207. X`009write_line("Can't parse explore (mini)map",E_tool,NULL);
  1208. X`009return 0;
  1209. X    `125
  1210. X   `032
  1211. X    /* y:   -1,-1 */
  1212. X    C = exp_lines`0910`093`091A`093;
  1213. X    if (C == ' ') `123
  1214. X`009write_line("Can't parse explore (mini)map",E_tool,exp_lines`0910`093);
  1215. X`009return 0;
  1216. X    `125
  1217. X    count_new(X,Y,-1,-1,&new_X,&new_Y);
  1218. X    map_add_sector(database,new_X,new_Y,C);
  1219. X
  1220. X    /* u:   1,-1 */
  1221. X    C = exp_lines`0910`093`091A+2`093;
  1222. X    if (C == ' ') `123
  1223. X`009write_line("Can't parse explore (mini)map",E_tool,exp_lines`0910`093);
  1224. X`009return 0;
  1225. X    `125
  1226. X    count_new(X,Y,1,-1,&new_X,&new_Y);
  1227. X    map_add_sector(database,new_X,new_Y,C);
  1228. X
  1229. X    /* g:   -2,0 */
  1230. X    C = exp_lines`0911`093`091B`093;
  1231. X    if (C == ' ') `123
  1232. X`009write_line("Can't parse explore (mini)map",E_tool,exp_lines`0911`093);
  1233. X`009return 0;
  1234. X    `125
  1235. X    count_new(X,Y,-2,0,&new_X,&new_Y);
  1236. X    map_add_sector(database,new_X,new_Y,C);
  1237. X
  1238. X    /* j:   2,0 */
  1239. X    C = exp_lines`0911`093`091B+4`093;
  1240. X    if (C == ' ') `123
  1241. X`009write_line("Can't parse explore (mini)map",E_tool,exp_lines`0911`093);
  1242. X`009return 0;
  1243. X    `125
  1244. X    count_new(X,Y,2,0,&new_X,&new_Y);
  1245. X    map_add_sector(database,new_X,new_Y,C);
  1246. X
  1247. X    /* b:   -1,1 */
  1248. X    C = exp_lines`0912`093`091A`093;
  1249. X    if (C == ' ') `123
  1250. X`009write_line("Can't parse explore (mini)map",E_tool,exp_lines`0912`093);
  1251. X`009return 0;
  1252. X    `125
  1253. X    count_new(X,Y,-1,1,&new_X,&new_Y);
  1254. X    map_add_sector(database,new_X,new_Y,C);
  1255. X
  1256. X    /* n:   1,1 */
  1257. X    C = exp_lines`0912`093`091A+2`093;
  1258. X    if (C == ' ') `123
  1259. X`009write_line("Can't parse explore (mini)map",E_tool,exp_lines`0912`093);
  1260. X`009return 0;
  1261. X    `125
  1262. X    count_new(X,Y,1,1,&new_X,&new_Y);
  1263. X    map_add_sector(database,new_X,new_Y,C);
  1264. X
  1265. X    /* h:   0,0 */
  1266. X    C = exp_lines`0911`093`091B+2`093;
  1267. X    if (C != des) `123
  1268. X`009write_line("Can't parse explore (mini)map",E_tool,exp_lines`0911`093);
  1269. X`009return 0;
  1270. X    `125
  1271. X
  1272. X    /* check that there is space left */
  1273. X    if (!realloc_database(database)) return 0;
  1274. X
  1275. X    pos = database -> count++;
  1276. X    temp = database -> sectors;
  1277. X `032
  1278. X    temp`091pos`093`091F_x`093.U_num = X;
  1279. X    temp`091pos`093`091F_y`093.U_num = Y;
  1280. X    temp`091pos`093`091F_des`093.U_char = des;
  1281. X
  1282. X    /* owner is unknown (me or deity) */
  1283. X   `032
  1284. X    ptr = exp_line;
  1285. X
  1286. X    ok = 1;
  1287. X    for (i = 0; stepper(&ptr,buffer,sizeof(buffer)) && i < MAX_ROWS; i++) `1
  1288. V23
  1289. X        match = database -> parse_index`091i`093;
  1290. X`009if (match == F_NULL) /* OK */;
  1291. X`009else switch (field_types`091match`093) `123
  1292. X`009    case DF_num:
  1293. X`009`009if (sscanf(buffer,"%d",
  1294. X`009`009    &temp`091pos`093`091match`093.U_num) != 1) ok = 0;
  1295. X`009    break;
  1296. X`009    case DF_string:
  1297. X`009`009change_str_field(temp,pos,match,buffer);
  1298. X`009    break;`009`009   `032
  1299. X`009    case DF_bool:
  1300. X`009`009if (strlen(buffer) != 1) ok = 0;
  1301. X`009`009temp`091pos`093`091match`093.U_bool = buffer`0910`093 != '.';
  1302. X`009    break;
  1303. X`009    case DF_char:
  1304. X`009`009if (strlen(buffer) != 1) ok = 0;
  1305. X`009`009temp`091pos`093`091match`093.U_char = buffer`0910`093;
  1306. X`009    break;
  1307. X`009`125
  1308. X    `125
  1309. X    if (!ok) write_line("Can't parse data",E_tool,exp_line);
  1310. X    return ok;
  1311. X`125
  1312. X
  1313. X
  1314. X#define EXP_LEAVE 'h'
  1315. X#define EXP_DONT_GO ".`094?"
  1316. X
  1317. Xstatic int select_target(sectors *database,cost_table costtable,
  1318. X    int *best_pos, float *best_cost)
  1319. X`123
  1320. X    char buffer`091ERROR_LEN`093;
  1321. X    int pos;
  1322. X    *best_pos = -1;
  1323. X    *best_cost = INFINITE_COST;
  1324. X
  1325. X    for (pos = 0; pos < database -> count; pos++) `123
  1326. X`009    if (costtable`091pos`093 < *best_cost &&
  1327. X`009`009database -> sectors`091pos`093`091F_des`093.U_char == '-' &&
  1328. X`009`009database -> sectors`091pos`093`091F_OWNED`093.U_bool != 1) `123
  1329. X
  1330. X`009    *best_cost = costtable`091pos`093;
  1331. X`009    *best_pos = pos;
  1332. X`009`125
  1333. X    `125
  1334. X
  1335. X    if (*best_pos == -1) return 0;
  1336. X    tar_X = database -> sectors`091*best_pos`093`091F_x`093.U_num;
  1337. X    tar_Y = database -> sectors`091*best_pos`093`091F_y`093.U_num;
  1338. X
  1339. X    sprintf(buffer,"Going to: %d,%d",tar_X,tar_Y);
  1340. X    write_line(buffer,E_tool,NULL);
  1341. X    return 1;
  1342. X`125
  1343. X
  1344. Xstatic void next_explore(void);
  1345. Xstatic int exp_var = -1;
  1346. X
  1347. Xstatic parse_dump_explore(data_type D,char *line)
  1348. X`123
  1349. X    static int error = 0;
  1350. X    static int stop = 0;
  1351. X    static int rest = 0;
  1352. X    if (temp_database.linecount == 0) `123
  1353. X`009temp_database.count = 0;
  1354. X    `009error = 0;
  1355. X`009rest = 0;
  1356. X`009if (!temp_database.sectors) `123
  1357. X`009    if(!init_database(&temp_database)) `123
  1358. X`009`009error = 1;
  1359. X`009`009return;
  1360. X`009    `125
  1361. X`009`125 else reset_database(&temp_database);
  1362. X    `125
  1363. X    if (D == D_EOD) `123  /* !!!!!!!!!! */
  1364. X`009error = 0;
  1365. X`009stop = 0;
  1366. X`009rest = 0;
  1367. X`009temp_database.linecount = 0;`009/* is ended */
  1368. X
  1369. X`009next_explore();   /* empiretool_cancel handled here */
  1370. X
  1371. X    `125 else if (D == D_data && IsWarning(line)) `123
  1372. X`009return; /* ok: IsWarning print message */
  1373. X    `125 else if (D == D_data && fatal_message(line)) `123
  1374. X`009error = 1;  /* COMMAND failed */
  1375. X`009return; /* fatal_message print message */
  1376. X    `125 else if (D == D_prompt) `123
  1377. X`009if (temp_database.linecount == 0 `124`124 error `124`124 rest) `123
  1378. X`009    ask_message(line);  /* ask from user */
  1379. X`009    return;`032
  1380. X`009`125 else if (stop) `123
  1381. X`009    char buffer`0912`093;
  1382. X`009    buffer`0910`093 = EXP_LEAVE;
  1383. X`009    buffer`0911`093 = '\0';
  1384. X`009    answer_query(buffer);
  1385. X`009    rest = 1;
  1386. X`009`125 else `123
  1387. X`009    char buffer`0912`093;
  1388. X`009    if (!parse_explore_query(&temp_database,line)) `123
  1389. X`009`009write_line("Can't parse:",E_tool,line);
  1390. X`009`009ask_message(line);
  1391. X`009`009error = 1;
  1392. X`009`009return;
  1393. X`009    `125
  1394. X`009    sort_database(&temp_database);   /* new update_database requires */
  1395. X`009    update_database(&dump_database,&temp_database);
  1396. X`009    check_visual();
  1397. X`009   `032
  1398. X`009    buffer`0910`093 = EXP_LEAVE;
  1399. X`009    buffer`0911`093 = '\0';
  1400. X`009    answer_query(buffer);
  1401. X`009    rest = 1;
  1402. X`009    return;
  1403. X`009`125
  1404. X    `125 else if (strstr(line,"can't go")) `123
  1405. X`009write_line(line,E_none,NULL);
  1406. X`009stop = 1;
  1407. X    `125 else if(rest) `123
  1408. X`009if (strstr(line,"is now yours")) `123
  1409. X`009    int X,Y;
  1410. X
  1411. X`009    if (sscanf(line,"Sector %d,%d",&X,&Y)) `123
  1412. X`009`009sector_data *secs2 = Locate(&dump_database,X,Y);
  1413. X
  1414. X`009`009write_line(line,E_none,NULL);
  1415. X`009`009if (!secs2) `123
  1416. X`009`009    char buffer`091ERROR_LEN`093;
  1417. X`009`009    sprintf(buffer,"cord: %d,%d",X,Y);
  1418. X`009`009    write_line("Internal error(parse_dump_explore): Sector not found
  1419. V from database",
  1420. X`009`009`009E_tool,buffer);
  1421. X`009`009`125 else `123
  1422. X`009`009    (*secs2)`091F_OWNED`093.U_bool = 1;`009/* this is mine */
  1423. X`009`009    (*secs2)`091F_civ`093.U_num  = 1;
  1424. X`009`009    (*secs2)`091F_mil`093.U_num  = 0;
  1425. X`009`009    (*secs2)`091F_mob`093.U_num  = 0;
  1426. X`009`009    add_to_var(exp_var,X,Y);
  1427. X`009`009`125
  1428. X`009    `125 else `123
  1429. X`009`009write_line("Can't parse (rest)",E_tool,line);
  1430. X`009`009error = 1;
  1431. X`009    `125
  1432. X`009`125 else `123
  1433. X`009    error = 1;
  1434. X`009    write_line("Can't parse (rest)",E_tool,line);
  1435. X`009`125
  1436. X    `125 else if (!parse_explore_line(&temp_database,line)) `123
  1437. X`009write_line("Can't parse",E_tool,line);
  1438. X`009error = 1;
  1439. X    `125
  1440. X`125
  1441. X
  1442. Xstatic void past_explore(void);
  1443. X
  1444. Xstatic int des_X,des_Y,des_C;
  1445. Xstatic int des_explore = 0;
  1446. Xstatic int des_var = -1;
  1447. Xstatic int exp_civ_limit = 2;
  1448. Xstatic int exp_mob_limit = 0;
  1449. Xstatic int btu_limit = 20;
  1450. Xstatic int exp_count = 0;
  1451. X
  1452. Xstatic void parse_dump_desig(data_type D,char *line)
  1453. X`123
  1454. X    static int error = 0;
  1455. X    if (D == D_EOD) `123 `032
  1456. X`009if (!error) `123
  1457. X`009    sector_data *secs = Locate(&dump_database,des_X,des_Y);
  1458. X`009    if (!secs) `123
  1459. X`009`009char buffer`091ERROR_LEN`093;
  1460. X`009`009sprintf(buffer,"cord: %d,%d",des_X,des_Y);
  1461. X`009`009write_line("Internal error(parse_dump_desig): Sector not found from
  1462. V database",
  1463. X`009`009    E_tool,buffer);
  1464. X`009    `125 if ((*secs)`091F_eff`093.U_num != UNKNOWN_num &&`032
  1465. X`009`009(*secs)`091F_eff`093.U_num > 2) `123
  1466. X`009`009(*secs)`091F_sdes`093.U_char = des_C;
  1467. X`009`009add_to_var(des_var,des_X,des_Y);
  1468. X`009    `125 else `123`009    /* supposed that efficiently is 0 */
  1469. X`009`009(*secs)`091F_des`093.U_char = des_C;
  1470. X`009`009(*secs)`091F_eff`093.U_num = 0;
  1471. X`009`009add_to_var(des_var,des_X,des_Y);
  1472. X`009    `125
  1473. X`009`125
  1474. X`009error = 0;
  1475. X`009if (des_explore) past_explore();
  1476. X`009else call_empiretool_handler();
  1477. X
  1478. X    `125 else if (D == D_data && IsWarning(line)) `123
  1479. X`009return; /* ok: IsWarning print message */
  1480. X    `125 else if (D == D_data && fatal_message(line)) `123
  1481. X`009error = 1;  /* COMMAND failed */
  1482. X`009return; /* fatal_message print message */
  1483. X    `125 else if (D == D_prompt) `123
  1484. X`009if (strstr(line,"(secs)")) ask_message(line);
  1485. X`009else answer_query(RS_ABORT);
  1486. X`009return;`032
  1487. X    `125 else `123
  1488. X`009write_line(line,E_none,NULL);
  1489. X`009error = 1;
  1490. X    `125
  1491. X`125
  1492. X
  1493. Xstatic void next_explore(void)
  1494. X`123
  1495. X    char buffer`091ERROR_LEN`093;
  1496. X    sector_data *secs = Locate(&dump_database,start_X,start_Y);
  1497. X    if (!secs) `123
  1498. X`009sprintf(buffer,"cord: %d,%d",start_X,start_Y);
  1499. X`009write_line("Internal error(next_explore): Sector not found from database
  1500. V",
  1501. X`009    E_tool,buffer);
  1502. X    `125
  1503. X
  1504. X    if (cur_mob != UNKNOWN_num && secs) `123
  1505. X`009    (*secs)`091F_mob`093.U_num = cur_mob; /* update mobility */
  1506. X`009    (*secs)`091F_civ`093.U_num --;`009    /* update civilians */
  1507. X    `125
  1508. X
  1509. X    if (empiretool_cancel) `123
  1510. X`009write_line("Autoexplore canceled.",E_tool,NULL);
  1511. X`009empiretool_cancel = 0;
  1512. X`009call_empiretool_handler();
  1513. X`009return;
  1514. X    `125
  1515. X`009
  1516. X
  1517. X    if (tar_X != cur_X `124`124 tar_Y != cur_Y `124`124 !secs) `123
  1518. X`009write_line("Autoexplore finished to error.",E_tool,NULL);
  1519. X`009call_empiretool_handler();
  1520. X`009return;
  1521. X    `125
  1522. X
  1523. X    exp_count ++;
  1524. X
  1525. X    des_X = cur_X;
  1526. X    des_Y = cur_Y;
  1527. X    des_C = '+';
  1528. X    des_explore = 1;
  1529. X    des_var = -1;
  1530. X    sprintf(buffer,"designate %d,%d %c",des_X,des_Y,des_C);
  1531. X    feed_command(buffer,parse_dump_desig);
  1532. X`125
  1533. X
  1534. Xstatic void start_explore(void);
  1535. X
  1536. Xstatic void past_explore(void)
  1537. X`123
  1538. X    char buffer`091ERROR_LEN`093;
  1539. X    sector_data *secs = Locate(&dump_database,start_X,start_Y);
  1540. X    if (!secs) `123
  1541. X`009sprintf(buffer,"cord: %d,%d",start_X,start_Y);
  1542. X`009write_line("Internal error(past_explore): Sector not found from database
  1543. V",
  1544. X`009    E_tool,buffer);
  1545. X    `125
  1546. X
  1547. X    if ((*secs)`091F_civ`093.U_num < 2 `124`124 cur_mob < 1) `123
  1548. X`009sprintf(buffer,"Autoexplore finished, %d sector%s explored.",
  1549. X`009    exp_count, exp_count != 1 ? "s" : "");
  1550. X`009write_line(buffer,E_none,NULL);
  1551. X`009call_empiretool_handler();
  1552. X`009return;
  1553. X    `125
  1554. X
  1555. X    if (BTU_left < btu_limit) `123
  1556. X`009sprintf(buffer,"BTU_limit reached, %d sector%s explored.",
  1557. X`009    exp_count, exp_count != 1 ? "s" : "");
  1558. X`009write_line(buffer,E_none,NULL);
  1559. X`009call_empiretool_handler();
  1560. X`009return;
  1561. X    `125
  1562. X    start_explore();
  1563. X`125
  1564. X
  1565. X
  1566. Xstatic void start_explore(void)
  1567. X`123
  1568. X#define MAX_PATH 15
  1569. X    cost_table costtable;
  1570. X    dir_table  dirtable;
  1571. X    int tpos,temp_X,temp_Y;
  1572. X    float cost;
  1573. X
  1574. X    char buffer`091PROMPT_SIZE`093;
  1575. X    char path`091MAX_PATH+2`093;
  1576. X
  1577. X    sector_data *secs = Locate(&dump_database,start_X,start_Y);
  1578. X
  1579. X    if (!secs) `123
  1580. X`009char buffer`091ERROR_LEN`093;
  1581. X`009sprintf(buffer,"cord: %d,%d",start_X,start_Y);
  1582. X`009write_line("Internal error(next_explore): Sector not found from database
  1583. V",
  1584. X`009    E_tool,buffer);
  1585. X`009call_empiretool_handler();
  1586. X`009return;
  1587. X    `125
  1588. X   `032
  1589. X    if ((*secs)`091F_civ`093.U_num < 2 `124`124 (*secs)`091F_civ`093.U_num <
  1590. V exp_civ_limit) `123
  1591. X`009write_line("No civilians to explore",E_tool,NULL);
  1592. X`009call_empiretool_handler();
  1593. X`009return;
  1594. X    `125
  1595. X
  1596. X    if (BTU_left < 5 `124`124 BTU_left < btu_limit)  `123
  1597. X`009write_line("No BTUs to explore",E_tool,NULL);
  1598. X`009call_empiretool_handler();
  1599. X`009return;
  1600. X    `125
  1601. X
  1602. X    calculate_cost(&dump_database,start_X,start_Y,
  1603. X`009costtable,dirtable,MAX_PATH);
  1604. X
  1605. X    if(!select_target(&dump_database,costtable,&tpos, &cost)) `123
  1606. X`009write_line("Nothing for explore",E_tool,NULL);
  1607. X`009call_empiretool_handler();
  1608. X`009return;
  1609. X    `125
  1610. X
  1611. X    if ((*secs)`091F_mob`093.U_num < cost * commodities`0910`093.mob_mul `12
  1612. V4`124
  1613. X`009(*secs)`091F_mob`093.U_num - cost * commodities`0910`093.mob_mul < exp_m
  1614. Vob_limit) `123
  1615. X`009write_line("No mobility to explore",E_tool,NULL);
  1616. X`009call_empiretool_handler();
  1617. X`009return;
  1618. X    `125
  1619. X`009
  1620. X    give_path(&dump_database,dirtable,path,tpos,&temp_X,&temp_Y);
  1621. X    if (temp_X != start_X `124`124 temp_Y != start_Y) `123
  1622. X`009write_line("Something is wrong with route",E_tool,NULL);
  1623. X`009call_empiretool_handler();
  1624. X`009return;
  1625. X    `125
  1626. X
  1627. X    cur_X = UNKNOWN_num;
  1628. X    cur_Y = UNKNOWN_num;
  1629. X    cur_mob = UNKNOWN_num;
  1630. X
  1631. X    sprintf(buffer,"explore civ %d,%d 1 %s",start_X,start_Y,path);
  1632. X    feed_command(buffer,parse_dump_explore);
  1633. X`125
  1634. X
  1635. X/* threshold ***************************************************************
  1636. V */
  1637. X
  1638. Xstatic dump_fields thre_field;
  1639. Xstatic int thre_amount;
  1640. Xstatic int thre_X,thre_Y;
  1641. Xstatic int thre_var = -1;
  1642. X
  1643. Xstatic void parse_dump_thre(data_type D,char *line)
  1644. X`123
  1645. X    int X,Y,val;
  1646. X
  1647. X    static int error = 0;
  1648. X    if (D == D_EOD) `123 `032
  1649. X`009if (empiretool_cancel) `123
  1650. X`009    write_line("Canceled.",E_tool,NULL);
  1651. X`009    empiretool_cancel = 0;
  1652. X`009`125 else if (!error) `123
  1653. X`009    sector_data *secs = Locate(&dump_database,thre_X,thre_Y);
  1654. X`009    if (!secs) `123
  1655. X`009`009char buffer`091ERROR_LEN`093;
  1656. X`009`009sprintf(buffer,"cord: %d,%d",thre_X,thre_Y);
  1657. X`009`009write_line("Internal error(parse_dump_thre): Sector not found from d
  1658. Vatabase",
  1659. X`009`009    E_tool,buffer);
  1660. X`009    `125 else `123`009  `032
  1661. X`009`009add_to_var(thre_var,thre_X,thre_Y);
  1662. X`009`009(*secs)`091thre_field`093.U_char = thre_amount;
  1663. X`009    `125
  1664. X`009`125
  1665. X`009error = 0;
  1666. X`009call_empiretool_handler();
  1667. X
  1668. X    `125 else if (D == D_data && IsWarning(line)) `123
  1669. X`009return; /* ok: IsWarning print message */
  1670. X    `125 else if (D == D_data && fatal_message(line)) `123
  1671. X`009error = 1;  /* COMMAND failed */
  1672. X`009return; /* fatal_message print message */
  1673. X    `125 else if (D == D_prompt) `123
  1674. X`009ask_message(line);
  1675. X`009return;`032
  1676. X    `125 else if (sscanf(line,"%d,%d old threshold %d",&X,&Y,&val) == 3) `12
  1677. V3
  1678. X`009if (X != thre_X `124`124 Y != thre_Y) `123
  1679. X`009    write_line("Wrong cordinates",E_tool,line);
  1680. X`009    error = 1;
  1681. X`009`125
  1682. X    `125 else `123
  1683. X`009write_line("Can't parse",E_tool,line);
  1684. X`009error = 1;
  1685. X    `125
  1686. X`125
  1687. X
  1688. X/* read DISTRIBUTE dump ***************************************************
  1689. V */
  1690. X
  1691. Xstatic int dist_cur = 0;
  1692. Xstatic int dist_count = 0;
  1693. Xstatic int dist_auto = 0;
  1694. Xstatic int dist_targ = 1;
  1695. Xstatic int dist_var = -1;
  1696. Xstatic selector dist_table;
  1697. Xstatic selector dist_targ_table;
  1698. X
  1699. X#define MAX_DIST_PATH 10
  1700. Xstatic char dist_path`091MAX_DIST_PATH+2`093;
  1701. X
  1702. Xstatic void next_distribute(void);
  1703. X
  1704. Xstatic void parse_dump_dist(data_type D,char *line)
  1705. X`123
  1706. X    static int error = 0;
  1707. X    static int ok = 0;
  1708. X    char *ptr;
  1709. X    if (D == D_EOD) `123 `032
  1710. X`009if (empiretool_cancel) `123
  1711. X`009    write_line("Canceled.",E_tool,NULL);
  1712. X`009`125 else if (!error) `123
  1713. X`009    sector_data *secs = Locate(&dump_database,start_X,start_Y);
  1714. X`009    if (!secs) `123
  1715. X`009`009char buffer`091ERROR_LEN`093;
  1716. X`009`009sprintf(buffer,"cord: %d,%d",start_X,start_Y);
  1717. X`009`009write_line("Internal error(parse_dump_dist): Sector not found from d
  1718. Vatabase",
  1719. X`009`009    E_tool,buffer);
  1720. X`009    `125 else if (ok) `123
  1721. X`009`009if (!dist_path`0910`093) change_str_field(secs,0,F_dist_path,"_");
  1722. X`009`009else change_str_field(secs,0,F_dist_path,dist_path);
  1723. X
  1724. X`009`009(*secs)`091F_dist_x`093.U_num = tar_X;
  1725. X`009`009(*secs)`091F_dist_y`093.U_num = tar_Y;
  1726. X`009`009dist_count ++;
  1727. X`009`009add_to_var(dist_var,start_X,start_Y);
  1728. X`009    `125 else `123
  1729. X`009`009write_line("Something goes wrong with distribute",E_tool,NULL);
  1730. X`009    `125
  1731. X`009`125
  1732. X`009error = 0;
  1733. X`009if (dist_auto && !empiretool_cancel) next_distribute();
  1734. X`009else call_empiretool_handler();
  1735. X`009ok = 0;
  1736. X`009empiretool_cancel = 0;
  1737. X
  1738. X    `125 else if (D == D_data && IsWarning(line)) `123
  1739. X`009return; /* ok: IsWarning print message */
  1740. X    `125 else if (D == D_data && fatal_message(line)) `123
  1741. X`009error = 1;  /* COMMAND failed */
  1742. X`009return; /* fatal_message print message */
  1743. X    `125 else if (D == D_prompt) `123
  1744. X`009ask_message(line);  /* ask from user */
  1745. X`009return;`032
  1746. X    `125 else if (D == D_data && (ptr = strstr(line,
  1747. X`009"New path distributes to"))) `123
  1748. X`009int x,y;
  1749. X`009write_line(line,E_none,NULL);
  1750. X`009if (sscanf(ptr,"New path distributes to %d,%d",&x,&y) != 2) `123
  1751. X`009    write_line("Can't parse",E_tool,ptr);
  1752. X`009    error = 1;
  1753. X`009`125 else if (x != tar_X `124`124 y != tar_Y) `123
  1754. X`009    write_line("Internal(?) error(parse_dump_dist); Cordinates not match
  1755. V",
  1756. X`009`009E_tool,ptr);
  1757. X`009    error = 1;
  1758. X`009`125 else ok = 1;
  1759. X    `125 else if (D == D_data && (ptr = strstr(line,
  1760. X`009"Distribution from and to"))) `123
  1761. X`009int x,y;
  1762. X`009write_line(line,E_none,NULL);
  1763. X`009if (sscanf(ptr,"Distribution from and to %d,%d",&x,&y) != 2) `123
  1764. X`009    write_line("Can't parse",E_tool,ptr);
  1765. X`009    error = 1;
  1766. X`009`125 else if (x != tar_X `124`124 y != tar_Y) `123
  1767. X`009    write_line("Internal(?) error(parse_dump_dist); Cordinates not match
  1768. V",
  1769. X`009`009E_tool,ptr);
  1770. X`009    error = 1;
  1771. X`009`125 else ok = 1;
  1772. X    `125 else `123
  1773. X`009write_line(line,E_none,NULL);
  1774. X`009/* these are only warnings */
  1775. X    `125
  1776. X`125
  1777. X
  1778. Xstatic void next_distribute(void)
  1779. X`123
  1780. X    sector_data *tar,*B = dump_database.sectors;
  1781. X    cost_table costtable;
  1782. X    dir_table dirtable;
  1783. X    char des,*oldpath;
  1784. X    int temp_X,temp_Y;
  1785. X    int try_next = 1;
  1786. X
  1787. X    char buffer`091COMMAND_SIZE`093;
  1788. X
  1789. X    if(dist_targ && !(tar = Locate(&dump_database,tar_X,tar_Y))) `123
  1790. X`009sprintf(buffer,"Internal error(next_distribute): sector not found %d,%d"
  1791. V,
  1792. X`009`009tar_X,tar_Y);
  1793. X`009write_line(buffer,E_tool,buffer);
  1794. X`009call_empiretool_handler();
  1795. X`009return;
  1796. X    `125
  1797. X
  1798. X    if (BTU_left <= btu_limit) `123
  1799. X`009sprintf(buffer,"BTU limit reached, %d sector%s modified.",
  1800. X`009    dist_count, dist_count != 1 ? "s" : "");
  1801. X`009write_line(buffer,E_tool,NULL);
  1802. X`009call_empiretool_handler();
  1803. +-+-+-+-+-+-+-+-  END  OF PART 6 +-+-+-+-+-+-+-+-
  1804.